import numpy as np
import mpmath as mpm
import pandas as pd


def fun1(t,eta_1,eta_2): #计算每个样本的对数似然比
    b = 1.5
    c = (eta_2 * eta_1) ** b / (eta_2 ** b - eta_1 ** b)
    d = b * mpm.log(eta_2 / eta_1)
    a= (t**b)/c-d
    return a

'''
对外调用接口;
提供给外部其他Python文件调用接口.
'''
def SPRT(data1,eta_1,eta_2,alpha_1,alpha_2,fun):
    a_1 = mpm.log(alpha_2 / (1 - alpha_1))
    a_2 = mpm.log((1 - alpha_2) / alpha_1)
    label=2
    data=np.array(data1)
    n=data.shape[0]
    m = 1
    T = 0
    U = a_1
    L = a_2
    while (label==2 and m <= n):
        T = T + fun(data[m-1],eta_1,eta_2) #分布形式不同，请重新编写似然函数比fun，此处应该计算的是eta2的似然函数比eta1的似然函数
        if T >= L:
            label=1
        elif T <= U:
            label=0
        else:
            m = m + 1
    return label


def sbtr_calculte(data,url):
    eta_1 = 587.84
    eta_2 = 1047.89
    alpha_1 = 0.1
    alpha_2 = 0.05

    if url:
        data_sum = pd.read_excel(url)
        label = SPRT(data_sum, eta_1, eta_2, alpha_1, alpha_2, fun1)
    else:
        label = SPRT(data, eta_1, eta_2, alpha_1, alpha_2, fun1)

    if label == 0:
        result = [[{'label': 0, '判断结果': 'eta_1'}]]
    elif label == 1:
        result = [[{'label': 1, '判断结果': 'eta_2'}]]
    else:
        result = [[{'label': 2, '判断结果': '无法判断'}]]
    return result

if __name__ =="__main__":
    '''
    以weibull分布为例来测试SPRT方法。让我们假设一个组件的寿命是由形状参数b = 1.5的威布尔分布描述的。我们将使用SPRT来确定组件是否满足以下可靠性要求:
    目标可靠性在200小时内的最低可靠性为82%。如果元件的可靠性为82%或更少，接受它的概率(即I型误差或β误差)应小于0.1。
    在200小时内达到92%。如果该组件达到或超过目标可靠性，则拒绝该组件的机会(即II型误差或α误差)应小于0.05。
    计算SPRT测试的接受和拒绝线。
    根据观察到的一系列故障时间决定是否接受或拒绝组件。
    '''

    path='SPRT_algorithm_data.xlsx'
    result = sbtr_calculte(None, path)
    # 输出label,label=0判断为eta_1，label=1判断为eta_2，label=2无法判断。
    print(result)